﻿using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Graphics;
using SuperRyoninRPG.Characters;

namespace SuperRyoninRPG.Main
{
	class Coin
	{        private Texture2D texture;
        private Vector2 origin;
        private SoundEffect collectedSound;        

        public const int PointValue = 30;
        public readonly Color Color = Color.Yellow;
 
        // 宝石は Y 軸に沿った基本位置からアニメーション表示されます。
        private Vector2 basePosition;
        private float bounce;

        public Stage Stage
        {
            get { return stage; }
        }
        Stage stage;

        /// <summary>
        /// ワールド空間内でのこの宝石の現在の位置を取得します。
        /// </summary>
        public Vector2 Position
        {
            get
            {
                return basePosition + new Vector2(0.0f, bounce);
            }
        }

        /// <summary>
        /// この宝石をワールド空間内に拘束する円を取得します。
        /// </summary>
        public Circle BoundingCircle
        {
            get
            {
                return new Circle(Position, Tile.Width / 3.0f);
            }
        }

        /// <summary> 
        /// 新しい宝石を構築します。
        /// </summary>
        public Coin(Stage stage, Vector2 position)
        {
            this.stage = stage;
            this.basePosition = position;

            LoadContent();
        }

        /// <summary>
        /// 宝石テクスチャーと収集したサウンドを
        /// 読み込みます。
        /// </summary>
        public void LoadContent()
        {
            texture = Stage.Content.Load<Texture2D>("Sprites/Coin");
            origin = new Vector2(texture.Width / 2.0f, texture.Height / 2.0f);
            collectedSound = Stage.Content.Load<SoundEffect>("Sounds/CoinCollected");
        }

        /// <summary>
        /// プレイヤーが収集したくなるように空中を上下に弾みます。
        /// </summary>
        public void Update(GameTime gameTime)
        {
            // 弾み制御定数
            const float BounceHeight = 0.18f;
            const float BounceRate = 3.0f;
            const float BounceSync = -0.75f;

            // 正弦曲線の時間の経過に沿って弾みます。
            // 隣接する宝石が魅力的な波形で弾むように X 軸を含めます。
            double t = gameTime.TotalGameTime.TotalSeconds * BounceRate + Position.X * BounceSync;
            bounce = (float)Math.Sin(t) * BounceHeight * texture.Height;
        }

        /// <summary>
        /// この宝石がプレイヤーに収集され、レベルから削除されたときに呼び出されます。
        /// </summary>
        /// <param name="collectedBy">
        /// この宝石を収集したプレイヤー。このパラメーターは現在使用されていませんが、パワーアップできる
        /// 特殊な宝石を作成する場合に便利です。たとえば、宝石はプレイヤーを無敵状態にします。
        /// </param>
        public void OnCollected(Player collectedBy)
        {
            collectedSound.Play();
        }

        /// <summary> 
        /// 適切な色で宝石を描画します。
        /// </summary>
        public void Draw(GameTime gameTime, SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(texture, Position, null, Color, 0.0f, origin, 1.0f, SpriteEffects.None, 0.0f);
        }        

	}
}
